卷积层的批标准化

Note

之前我们讲过全连接层的批标准化(Batch Normalization,BN),卷积层的批标准化也是类似的

形式化

回想全连接层的批标准化:

\[\mathrm{BN}(\mathbf{x}) = \boldsymbol{\gamma}\odot\frac{\mathbf{x} - \hat{\boldsymbol{\mu}}_{\mathcal{B}}}{\hat{\boldsymbol{\sigma}}_{\mathcal{B}}} + \boldsymbol{\beta}\]
\[\hat{\boldsymbol{\mu}}_{\mathcal{B}} = \frac{1}{|\mathcal{B}|}\sum_{x\in{\mathcal{B}}}\mathbf{x}\]
\[\hat{\boldsymbol{\sigma}}_{\mathcal{B}}^{2} = \frac{1}{|\mathcal{B}|}\sum_{x\in{\mathcal{B}}}(\mathbf{x} - \hat{\boldsymbol{\mu}}_{\mathcal{B}})^{2} + \boldsymbol{\epsilon}\]

卷积层批标准化也是这个公式,\(\boldsymbol{\gamma},\boldsymbol{\beta}\) 是可训练参数。

Warning

区别在于卷积层的是每个输入通道一个标量均值和方差,不像全连接层的是每个特征一个标量均值和方差。
这样有多少个通道就有多少个均值、方差对;标准化后可以保证各个通道总体在一个量纲。
卷积层的批标准化也是在卷积之后,激活函数之前。

BatchNorm2d

import torch
from torch import nn

# (batch_size, num_channels, h, w)
x = torch.rand(16, 10, 28, 28)
# 需指定num_channels
m = nn.BatchNorm2d(10)
# same as x
m(x).shape
torch.Size([16, 10, 28, 28])